#include <string>
#include <vector>
#include <memory> // 智能指针相关头文件
#include <cstdio>
#include "server.hpp"

using namespace std;
using namespace nt_server;

// 大写转小写（英文字母）
std::string UpToLow(const std::string& resquest)
{
    std::string ret(resquest);

    for(auto &rc : ret)
    {
        if(isupper(rc))
            rc += 32;
    }

    return ret;
}

// 安全检查
bool checkSafe(const std::string& comm)
{
    // 构建安全检查组
    std::vector<std::string> unsafeComms{"kill", "mv", "rm", "while :; do", "shutdown"};

    // 查找 comm 中是否包含安全检查组中的字段
    for(auto &str : unsafeComms)
    {
        // 如果找到了，就说明存在不安全的操作
        if(comm.find(str) != std::string::npos)
            return false;
    }

    return true;
}

// 远程 bash
std::string ExecCommand(const std::string& request)
{
    // 1.安全检查
    if(!checkSafe(request))
        return "Non-safety instructions, refusal to execute!";

    // 2.获取执行结果
    FILE* fp = popen(request.c_str(), "r");
    if(fp == NULL)
        return "Can't execute command!";

    // 3.将结果读取至字符串中
    std::string ret;
    char buffline[1024]; // 行缓冲区
    while (fgets(buffline, sizeof(buffline), fp) != NULL)
    {
        // 将每一行结果，添加至 ret 中
        ret += buffline;
    }

    // 4.关闭文件流
    fclose(fp);

    // 5.返回最终执行结果
    return ret;
}

int main()
{
    unique_ptr<UdpServer> usvr(new UdpServer(ExecCommand));

    // 初始化服务器
    usvr->InitServer();

    // 启动服务器
    usvr->StartServer();

    return 0;
}